Web前端实践:Node

您所在的位置:网站首页 js 公钥解密 Web前端实践:Node

Web前端实践:Node

#Web前端实践:Node| 来源: 网络整理| 查看: 265

1 Node-RSA 与 JSEncrypt 实现前端加密后端解密功能

cnpm install jsencrypt -S

cnpm install node-rsa -S

1.1 生成私钥、公钥对 var NodeRSA = require('node-rsa') //1.创建RSA对象,并指定 秘钥长度 var key = new NodeRSA({ b: 512 }); key.setOptions({ encryptionScheme: 'pkcs1' });//指定加密格式 //2.生成 公钥私钥,使用 pkcs8标准,pem格式 var publicPem = key.exportKey('pkcs8-public-pem');//制定输出格式 var privatePem = key.exportKey('pkcs8-private-pem'); console.log('公钥:\n',publicPem); console.log('私钥:\n', privatePem);

image-20201227204353247

node-rsa中有对公钥私钥的规定

image-20201227204959767

可以看出,我们生成的属于pkcs8,而且导出的方法是pkcs8-private-pem,这个在后面后端解密的时候需要再次用到

1.2 前端加密

前端在/js文件夹中准备好了JSEncrypt的代码

在页面js中

var encryptor = new JSEncrypt(); var pubKey = `-----BEGIN PUBLIC KEY----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAI4Sd1JVtIIrHDoMcknO6iva2+iAMPFo Jx+dGrjlgvcYdyePwPJft1ZB4WkZb/vRHN8UKn123CV5B2XolmqrDv0CAwEAAQ== -----END PUBLIC KEY-----` encryptor.setPublicKey(pubKey)

在ajax请求时对数据进行加密

data: { username:encryptor.encrypt(document.getElementById("username").value) , password:encryptor.encrypt(document.getElementById("password").value) } 1.3 后端解密

后端使用node-rsa进行解密,需要注意的是,因为jsencrypt自身使用的是pkcs1加密方案, nodejs需要修改成pkcs1。

var NodeRSA = require('node-rsa') const priKey ='-----BEGIN PRIVATE KEY-----\n'+ 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAjhJ3UlW0giscOgxy\n'+ 'Sc7qK9rb6IAw8WgnH50auOWC9xh3J4/A8l+3VkHhaRlv+9Ec3xQqfXbcJXkHZeiW\n'+ 'aqsO/QIDAQABAkBwCF/PrYYKn7RCkk4Npf1DV/LSBUSTGW7An0LTSylbb+HKp73X\n'+ 'QUeALkJ3ranLe3UBiAGXZq4IywuDVSu9I4yBAiEAzoY9O1TRcQt8QdG6wNjB5VQM\n'+ 'zmkTtMzicBEu2JtCu7cCIQCwG31HUw7+emB6eDiiLDor/IoeQxujEZu4tMgXcDky\n'+ '6wIhAMuT8+P6dgJzCedvsCHNCUTgF0eYuL4ugL9rkLwgQCX9AiAwLYULYyyh78a/\n'+ 'Gm6b5y+O4wrCFqfT57hLQqHOz7PGOwIgPN0W26+BrhXIaazkCEf0/qz95cwHEdgl\n'+ 'Sc6Jev4DrBw=\n'+ '-----END PRIVATE KEY-----' var decrypt = new NodeRSA(priKey,'pkcs8-private-pem') decrypt.setOptions({ encryptionScheme: 'pkcs1' })

在接受请求时,对数据进行解密,并尝试进行解密

app.post("/register",function(req,res){ var name = decrypt.decrypt(req.body.username,'utf-8'); var psw = decrypt.decrypt(req.body.password,'utf-8'); console.log("name "+name+' psw '+psw); ... } 1.4 效果

可以看到,前端发出的请求被加密

image-20201227205615628

而后端经过解密后,得到了正确的数据

image-20201227205642565

参考链接:

前端利用jsencrypt.js进行RSA加密https://www.jianshu.com/p/5008a407b558

nodejs RSA 与 jsencrypt实现前端加密后端解密功能https://blog.csdn.net/weixin_34037515/article/details/92411973

前端加解密方案探讨https://www.cnblogs.com/wonyun/p/10164364.html

2 sha512数据存储加密

在存储到数据库的时候,也需要进行加密,而不应该明文存储,这里选择了使用sha512进行加密

cnpm install js-sha512 --save

这里使用了用户名作为加盐值

var sha512 = require('js-sha512'); var sha = sha512(name+psw); var myobj = { 'name': name, 'password': sha }; ... userdb.insertOne(myobj);

可以看到,经过处理后的数据库密码使用了密文存储

image-20201227210041472



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3